package com.adee.gulimall.gateway.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Date;

/**
 * 自定义单一过滤器
 * 即使 Spring Cloud Gateway 自带许多实用的 GatewayFilter Factory、Gateway Filter、
 * Global Filter ，但是在很多情景下我们仍然希望可以自定义自己的过滤器，实现一些骚操作。
 * 1.自定义网关过滤器需要实现以下两个接口 ： GatewayFilter ， Ordered；
 * 2.@Configuration注册过滤器
 */
@Slf4j
@Deprecated
public class CustomGatewayFilter implements GatewayFilter, Ordered {

    /**
     * 过滤器逻辑
     * @param exchange 可以拿到对应的request和response
     * @param chain 过滤器链
     * @return 是否放行
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("执行单一过滤器逻辑");
        //获取第一个参数
        String id = exchange.getRequest().getQueryParams().getFirst("id");
        //打印当前时间
        log.info("MyFilter 当前请求时间为:"+new Date());
        //判断用户是否存在
        if(StringUtils.isEmpty(id)){
            log.info("用户名不存在，非法请求！");
            //如果username为空，返回状态码为407，需要代理身份验证
            exchange.getResponse().setStatusCode(HttpStatus.PROXY_AUTHENTICATION_REQUIRED);
            // 后置过滤器
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

    /**
     * 过滤器执行顺序，数值越小，优先级越高
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}
